#ifndef __BASIC_PARA_H__
#define __BASIC_PARA_H__

#include <basic/misc.h>

__BEGIN_DECLS

#define PARA_ITEM_DLM			'\xff'  /* 分隔符 */
#define PARA_ITEM_SIZE_CHAR      5
#define PARA_ITEM_MAX_SIZE   \
((1<<PARA_ITEM_SIZE_CHAR*BIT_OF_CHAR/2)-1)   /* 参数项最大长度 */

/*
 * 提取参数
 */
extern char *	/* 参数 NULL:参数字串错误或已取完 */
para_get_item(
        char *str,          /* [IN] 参数字串 */
        char **pcurr        /* [IN] 当前待处理位置
                               [OUT] 跳过当前参数，下一待处理位置 */
        );

/*
 * 提取参数，不改变字串
 */
extern char	*	/* 参数复制，需要释放 NULL:参数字串错误或已取完 */
para_peek_item(
        char *str,          /* [IN] 字串缓冲区 */
        char **pcurr        /* [IN] 当前待处理位置
                               [OUT] 跳过当前参数，下一待处理 */
        );

/*
 * 从字串末尾提取参数
 */
extern char *	/* 参数 NULL:参数字串错误或已取完 */
para_pop_item(
        char *str           /* [IN] 字串缓冲区 */
        );

/*
 * 将参数插入到字串头部
 */
extern int	/* 本字串项给缓冲区内容增加的长度 */
para_insert_item(
        char *str,			/* [IN,OUT] 字串缓冲区 */
        char *val			/* [IN] 字串项 */
        );

/*
 * 将参数附加到字串尾部
 */
extern int  /* 本字串项给缓冲区内容增加的长度 */
para_put_item(
        char *str,			/* [IN] 字串缓冲区 */
        char *val			/* [IN] 字串项 */
        );

extern int
para_put_item_int(
        char *str,
        int val
        );

extern int
para_put_item_int_fixed(
        char *str,
        int val,
        int width
        );

extern int
para_put_item_int64(
        char *str,
        int64_t val
        );

extern int
para_put_item_int64_fixed(
        char *str,
        int64_t val,
        int width
        );

#define para_put_item_short(s,v) \
    para_put_item_int_fixed(s,v,6)
#define para_put_item_long(s,v) \
    para_put_item_int64_fixed(s,(int64_t)v,12)

struct _para;
typedef struct _para *PARA;

/*
 * 载入参数
 */
extern int  /* 0:成功 -1:属性格式错误 -2:数字长度错误
               -3:字串长度错误 -5:不存在的属性
               -6:括号对不完整
               正整数:错误参数序号，从1开始 */
para_load(
        char *msg,              /* [IN] 参数字串 */
        char *desc,             /* [IN] 参数描述 */
        PARA *ppara             /* [OUT] 参数接口 */
        );

/*
 * 释放参数
 */
extern void
para_free(
        PARA para               /* [IN] 参数接口 */
        );

/*
 * 参数数量
 */
extern int  /* 整数>=0 */
para_num(
        PARA para               /* [IN] 参数接口 */
        );

/*
 * 根据下标引用参数
 */
extern int  /* 0:成功 -1:下标越界 */
para_ref_by_index(
        PARA para,              /* [IN] 参数接口 */
        int idx,                /* [IN] 下标 */
        char **pname,           /* [OUT] 参数名称 NULL:不复制 */ 
        char **pvalue           /* [OUT] 参数值 */
        );

/*
 * 根据下标复制参数
 */
extern int  /* 0:成功 -1:下标越界 */
para_copy_by_index(
        PARA para,              /* [IN] 参数接口 */
        int idx,                /* [IN] 下标 */
        char *name,             /* [OUT] 参数名称 NULL:不复制 */ 
        char *value             /* [OUT] 参数值 */
        );

/*
 * 根据名称引用参数
 */
extern int  /* 0:成功 -1:.后无名称 -2:名称不匹配
               -3:[后无] -4:下标不为数字 -5:下标越界 */
para_ref_by_name(
        PARA para,              /* [IN] 参数接口 */
        char *name,             /* [IN] 参数名称 */ 
        char **pvalue           /* [OUT] 参数值 */
        );

/*
 * 根据名称复制参数
 */
extern int  /* 0:成功 -1:.后无名称 -2:名称不匹配
               -3:[后无] -4:下标不为数字 -5:下标越界 */
para_copy_by_name(
        PARA para,              /* [IN] 参数接口 */
        char *name,             /* [IN] 参数名称 */ 
        char *value             /* [OUT] 参数值 */
        );

__END_DECLS

#endif
